/*
 * Bandera.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 21/09/2009, 10:45:38 PM
 */

package com.ufps.cuatro.util;

import java.util.Observable;

import com.ufps.cuatro.util.constantes.ConstBandera;
import java.util.HashMap;

/**
 * <i><b>Bandera:</b></i><p>Esta Clase Implementa el Soporte de intercambio de 
 * Notificaciones de estados en la Aplicación.</p>
 * 
 * <p>Una Notificación de estado se refiere al paso de mensajes desde vista
 * diferentes por medio del sistema de notificaciones de java Observer/Observable.</p>
 * 
 * <p>Este Clase es wrapper de ese modelo el cual abstrae y define funcionalidades 
 * basicas que permite el itnercambio de objetos y paso de mensajes en la apliacación.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 21/09/2009
 * @see ConstBandera
 * @see Observable
 */
public class Bandera extends Observable implements ConstBandera, Cloneable {
    private static final long serialVersionUID = -3944460417647733389L;
    
    /**
     * 
     */
    public final static String OPC_AGREGAR_COMPONENTE_BIBLIOTECA_GLOBAL = "OACBG";
    /**
     * 
     */
    public final static String OPC_TIPO_DATO_KEY_MODELO_ASOCIADO = "OTDKMA";
    /**
     * 
     */
    public final static String OPC_TIPO_DATO_OBJECT_MODELO_ASOCIADO = "OTDOMA";
    
    /**
     * 
     */
    public final static String OPC_SELECCION_BEANS_KEY_MODELO_ASOCIADO = "OSBKMA";
    /**
     * 
     */
    public final static String OPC_SELECCION_BEANS_OBJECT_MODELO_ASOCIADO = "OSBOMA";
    
    /**
     * 
     */
    public final static String OPC_SELECCION_COMPONENTE_DISTRIBUIDOR_KEY = "OSCDK";
    /**
     * 
     */
    public final static String OPC_SELECCION_COMPONENTE_DISTRIBUIDOR_OBJECT = "OSCDO";
    
    /**
     * 
     */
    public final static String OPC_OBJECT_INCLUIDO = "OOI";
    
    private Object obj;
    private int estado;
    private int idTab;
    private int id;
    private boolean flag;
    private String opcion;
    private String string;
    private int Int;  
    
    private HashMap<String, Object>objOpciones;

    /**
     * Constructor por defecto
     */
    public Bandera() {
        objOpciones = new HashMap<String, Object>();
    }

    /**
     * @DefinicionMetodo
     * @param estado @DefinicionParametro
     */
    public Bandera(int estado) {
        this.estado = estado;
        objOpciones = new HashMap<String, Object>();
    }

    /**
     * @DefinicionMetodo
     * @param obj @DefinicionParametro
     * @param estado @DefinicionParametro
     */
    public Bandera(Object obj, int estado) {
        this.obj = obj;
        this.estado = estado;
        objOpciones = new HashMap<String, Object>();
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public int getId() {
        return id;
    }

    /**
     * @DefinicionMetodo
     * @param id @DefinicionParametro
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public int getEstado() {
        return estado;
    }

    /**
     * @DefinicionMetodo
     * @param estado @DefinicionParametro
     */
    public void setEstado(int estado) {
        this.estado = estado;        
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public Object getObj() {
        return obj;
    }

    /**
     * @DefinicionMetodo
     * @param obj @DefinicionParametro
     */
    public void setObj(Object obj) {
        this.obj = obj;        
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public int getIdTab() {
        return idTab;
    }

    /**
     * @DefinicionMetodo
     * @param idTab @DefinicionParametro
     */
    public void setIdTab(int idTab) {
        this.idTab = idTab;
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public boolean isFlag() {
        return flag;
    }

    /**
     * @DefinicionMetodo
     * @param flag @DefinicionParametro
     */
    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public String getOpcion() {
        return opcion;
    }

    /**
     * @DefinicionMetodo
     * @param opcion @DefinicionParametro
     */
    public void setOpcion(String opcion) {
        this.opcion = opcion;
    }

    /**
     * 
     * @return
     */
    public int getInt() {
        return Int;
    }

    /**
     * 
     * @param Int
     */
    public void setInt(int Int) {
        this.Int = Int;
    }

    /**
     * 
     * @return
     */
    public String getString() {
        return string;
    }

    /**
     * 
     * @param string
     */
    public void setString(String string) {
        this.string = string;
    }
    
    

    /**
     * @DefinicionMetodo
     */
    public void notificar(){
        this.setChanged();
        this.notifyObservers();
    }

    /**
     * @DefinicionMetodo
     * @param estado @DefinicionParametro
     */
    public void notificar(int estado){
        this.estado = estado;
        this.setChanged();
        this.notifyObservers();
    }

    /**
     * @DefinicionMetodo
     * @param obj @DefinicionParametro
     */
    public void notificar(Object obj){
        this.obj = obj;
        this.setChanged();
        this.notifyObservers(obj);
    }

    /**
     * @DefinicionMetodo
     * @param estado @DefinicionParametro
     * @param obj @DefinicionParametro
     */
    public void notificar(int estado, Object obj){
        this.estado = estado;
        this.obj = obj;
        this.setChanged();
        this.notifyObservers();
    }
    
    /**
     * 
     * @param key
     * @param value
     * @return
     */
    public Object add(String key, Object value){
        return this.objOpciones.put(key, value);
    }
    
    /**
     * 
     * @param key
     * @return
     */
    public Object get(String key){
        return this.objOpciones.get(key);
    }
    
    /**
     * 
     * @param key
     * @return
     */
    public boolean isOpcion(String key){
        return this.objOpciones.containsKey(key);
    }

    /**
     * 
     * @return
     */
    public HashMap<String, Object> getObjOpciones() {
        return objOpciones;
    }

    /**
     * 
     * @param objOpciones
     */
    public void setObjOpciones(HashMap<String, Object> objOpciones) {
        if(objOpciones == null)return;//controlar inicializacion por error
        this.objOpciones = objOpciones;
    }

    @Override
    public Object clone(){        
        Bandera o = new Bandera();
        o.setEstado(estado);
        o.setFlag(flag);
        o.setId(id);
        o.setIdTab(idTab);
        if(obj != null)o.setObj(obj);        
        if(objOpciones != null)o.setObjOpciones((HashMap<String, Object>)objOpciones.clone());
        if(opcion != null)o.setOpcion(opcion.substring(0));
        if(string != null)o.setString(string.substring(0));               
        return o;
    }
    
    
    
    
}
